package cn.mong.util.modelexcel;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import cn.mong.util.modelexcel.CellStyleCustomizer.DefaultCellStyleCustomizer;
import cn.mong.util.modelexcel.ModelToCellsConverter.DefaultModelToCellsConverter;

/**
 * 用于定义excel导出时所需要的数据模型元数据
 * 下面为一个标识的例子.
 * <pre>
 * public class Organ{
        {@code @ExcelCol(name="组织编码", index=1) }
        private String code;

        {@code @ExcelCol(name="组织名称", index=2) }
        private String name;

        {@code @ExcelCol(name="主管信息", index=3, subClass=Manager.class) }
        private Manager manager;

        {@code @ExcelCol(name="下级组织", index=4, subClass=Organ.class) }
        {@code private List<Organ> subOrgans; }

        public static class Manager{
            {@code @ExcelCol(name="头衔", index=1) }
            private String position;

            {@code @ExcelCol(name="姓名", index=2) }
            private String name;
        }
    }
 * 
 *</pre>
 * 
 * @author mengxianming@2021-8-20 9:14:56
 *
 */
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ExcelCol {
    /**
     * 列所在索引。注意此索引是逻辑索引，某列横向合并N个单元格，也只占用1个索引位置。索引是从1开始的。
     * @return
     */
    int index() default 1;

    /**
     * 某列横向合并的单元格总数。不合并即为1.
     * 注意：使用DynaHeaderAnnotationModelWriter导出时，每一列的横向合并格数为动态计算，故此处设置不起作用。
     * @return
     */
    int xspan() default 1;

    /**
     * 列宽度(占用字符数)
     * @return
     */
    int width() default 10;

    /**
     * 列标题。若不指定则取bean字段名
     * @return
     */
    String name() default "";

    /**
     * 该字段是否渲染成一个子表格。通常用于层级展示。若不为 {@code Object.class}，框架会递归渲染该字段
     * @return
     */
    Class<?> subClass() default Object.class;
    
    /**
     * subClass有效时，递归的深度
     * @return
     */
    int recursiveDepth() default 3;
    
    /**
     * 指定当前字段值转换为单元格列表的转换器。本属性与subClass属性是互斥的。若同时指定，则以subClass为准。
     * @return
     */
    Class<? extends ModelToCellsConverter<?>> modelToCellsConverter() default DefaultModelToCellsConverter.class;
    
    /**
     * modelToCellsConverter属性生效, 且修饰的字段为集合类型时才有效。模型渲染到excel的方向。true表示水平扩展(按列扩展), false表示纵向扩展(按行扩展)
     * @return
     */
    boolean modelToCellsHorizontal() default false;
    
    /**
     * 标题样式定制器
     * @return
     */
    Class<? extends CellStyleCustomizer> headerCellStyleCustomizer() default DefaultCellStyleCustomizer.class;
  
    
    /**
     * 值样式定制器
     * @return
     */
    Class<? extends CellStyleCustomizer> valueCellStyleCustomizer() default DefaultCellStyleCustomizer.class;
}